package com.gzc.just.play.last.war.sceneserver.attribute;

/**
 * 属性修改器 - 用于应用临时的属性修改
 *
 * 支持多种修改方式：
 * - 固定值加成/减少
 * - 百分比加成
 * - 临时修改
 * - 持续时间限制
 *
 * 对应C++的属性加成系统
 *
 * @author AI编程助手
 * @version 1.0
 * @since 2025-11-22
 */
public class AttributeModifier {
    
    public enum ModifierType {
        /** 固定值加成 */
        FIXED_VALUE,
        /** 百分比加成 */
        PERCENT,
        /** 两者都有 */
        MIXED;
    }
    
    private final String id;
    private final String name;
    private final AttributeType attributeType;
    private final ModifierType modifierType;
    private final double value;
    private final double percentValue;
    private final long duration; // 持续时间（毫秒），-1表示永久
    private long startTime;
    private long endTime;
    private boolean active;
    
    /**
     * 创建属性修改器（固定值）
     *
     * @param id 修改器ID
     * @param name 修改器名称
     * @param attributeType 属性类型
     * @param value 固定值修改量
     * @param duration 持续时间（毫秒），-1表示永久
     */
    public AttributeModifier(String id, String name, AttributeType attributeType, 
                            double value, long duration) {
        this.id = id;
        this.name = name;
        this.attributeType = attributeType;
        this.modifierType = ModifierType.FIXED_VALUE;
        this.value = value;
        this.percentValue = 0;
        this.duration = duration;
        this.active = true;
        this.startTime = System.currentTimeMillis();
        this.endTime = duration < 0 ? Long.MAX_VALUE : startTime + duration;
    }
    
    /**
     * 创建属性修改器（百分比）
     *
     * @param id 修改器ID
     * @param name 修改器名称
     * @param attributeType 属性类型
     * @param percentValue 百分比值（0.1表示10%）
     * @param duration 持续时间（毫秒），-1表示永久
     */
    public AttributeModifier(String id, String name, AttributeType attributeType,
                            double percentValue, long duration, boolean isPercent) {
        this.id = id;
        this.name = name;
        this.attributeType = attributeType;
        this.modifierType = ModifierType.PERCENT;
        this.value = 0;
        this.percentValue = isPercent ? percentValue : 0;
        this.duration = duration;
        this.active = true;
        this.startTime = System.currentTimeMillis();
        this.endTime = duration < 0 ? Long.MAX_VALUE : startTime + duration;
    }
    
    /**
     * 创建属性修改器（混合）
     *
     * @param id 修改器ID
     * @param name 修改器名称
     * @param attributeType 属性类型
     * @param value 固定值修改量
     * @param percentValue 百分比修改量
     * @param duration 持续时间（毫秒）
     */
    public AttributeModifier(String id, String name, AttributeType attributeType,
                            double value, double percentValue, long duration) {
        this.id = id;
        this.name = name;
        this.attributeType = attributeType;
        this.modifierType = ModifierType.MIXED;
        this.value = value;
        this.percentValue = percentValue;
        this.duration = duration;
        this.active = true;
        this.startTime = System.currentTimeMillis();
        this.endTime = duration < 0 ? Long.MAX_VALUE : startTime + duration;
    }
    
    public String getId() {
        return id;
    }
    
    public String getName() {
        return name;
    }
    
    public AttributeType getAttributeType() {
        return attributeType;
    }
    
    public ModifierType getModifierType() {
        return modifierType;
    }
    
    public double getValue() {
        return value;
    }
    
    public double getPercentValue() {
        return percentValue;
    }
    
    public long getDuration() {
        return duration;
    }
    
    public long getStartTime() {
        return startTime;
    }
    
    public long getEndTime() {
        return endTime;
    }
    
    public boolean isActive() {
        return active;
    }
    
    /**
     * 更新修改器状态
     *
     * @param currentTime 当前时间
     * @return 如果修改器仍然有效，返回true；否则返回false
     */
    public boolean update(long currentTime) {
        if (!active) {
            return false;
        }
        
        if (currentTime >= endTime) {
            active = false;
            return false;
        }
        
        return true;
    }
    
    /**
     * 检查修改器是否已过期
     *
     * @return 如果已过期，返回true
     */
    public boolean isExpired() {
        return !active || System.currentTimeMillis() >= endTime;
    }
    
    /**
     * 获取剩余持续时间（毫秒）
     *
     * @return 剩余时间，如果已过期返回0，如果永久返回-1
     */
    public long getRemainingDuration() {
        if (duration < 0) {
            return -1; // 永久修改
        }
        
        long remaining = endTime - System.currentTimeMillis();
        return Math.max(0, remaining);
    }
    
    /**
     * 手动停用修改器
     */
    public void deactivate() {
        this.active = false;
    }
    
    @Override
    public String toString() {
        return String.format("AttributeModifier{name='%s', type=%s, value=%.1f, percent=%.1f%%, duration=%dms, active=%b}",
            name, attributeType.getDisplayName(), value, percentValue * 100, 
            getRemainingDuration(), active);
    }
}
